package reflect;

import socket.Client;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.nio.channels.ClosedSelectorException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * java反射机制
 * 反射是Java的动态机制，Java所有优秀的框架都是基于反射机制实现的。
 *
 * 反射机制允许程序在（允许期间）再取确定做某些事情，比如说具体实例化哪个对象，调用了哪些方法
 * 操作什么属性
 * 反射机制大大提高了代码的灵活性，但是也带来了执行效率变慢的情况
 * 因此反射机制不能过度使用
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws Exception {

        //
        /*
        获取类对象的四种方式
        1. 通过类名.class
        2. 通过对象.getClass()
        3. 通过Class.forName("全类名")
        4. 通过类加载器.loadClass("全类名")

         */

        Class cls5=String.class;
        Class cls6=int.class;
        Class cls7=Class.forName("java.lang.String");
        Class cls8=Class.forName("java.util.ArrayList");
        Class cls9= Class.forName("java.lang.reflect.Method");
        Class cls10=Class.forName("java.lang.reflect.Method");
        String str2="11";
        Class cls11=str2.getClass();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入类名：");
        String className2=scanner.nextLine();
        Class cls12=Class.forName(className2);
        System.out.println(cls12);
        Object obj=cls12.newInstance();
        System.out.println(obj);

        //
        Class cls13=Class.forName("reflect.Person");
        Constructor c=cls13.getConstructor(String.class);
        Object obj2=c.newInstance("999");
        System.out.println(obj2);
        //
        Constructor c1=cls13.getConstructor(String.class,int.class);
        Object obj3=c1.newInstance("666",99);
        System.out.println(obj3);



        //1.
        String str=null;
        //Class cls=String.class;
        //Class cls= ArrayList.class;
        //2.
        //Class cls=Class.forName("java.long.String");
        //Class cls=Class.forName("java.util.ArrayList");

        Scanner scan=new Scanner(System.in);
        System.out.println("请输入类名：");
        String className=scan.nextLine();
        Class cls=Class.forName(className);




        //通过类名.class类对象放映出其表示的类的完全限定名
        str=cls.getName();
        System.out.println(str);
        //仅获取类名
        str=cls.getSimpleName();
        System.out.println(str);
        /*
        java.lang.Package  //它的每一个实例对象
        java.long.Class   //
        上述都是反射对象
         */
        Package pack=cls.getPackage();
        //获取包名
        System.out.println(pack.getName());

        //通过类对象放映出它表示的类的方法
        Method[] methods=cls.getMethods();
        System.out.println("共："+methods.length+"个方法");
        for (Method m:methods){
            System.out.println(m.getName());
        }

    }
}
